package com.hk.controller;

import com.hk.entity.Admin;
import com.hk.entity.Result;
import com.hk.entity.Stu;
import com.hk.service.AdminService;
import com.hk.service.StuService;
import com.hk.utils.JwtUtils;
import com.hk.utils.PBKDF2Utils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@Slf4j
@RestController
public class LoginController {
    @Autowired
    private AdminService adminService;

    @PostMapping("/admin/login")
    public Result Login(@RequestBody Admin admin){
        log.info("管理员登录！：admin:{}", admin);
        Admin admin1 = adminService.login(admin);
        log.info("admin1数据: {}",admin1);
        //登录成功，生成令牌，下发令牌
        if (admin1 != null){

            Map<String,Object> claims = new HashMap<>();
            claims.put("id",admin1.getId());
            claims.put("name",admin1.getName());
            claims.put("adminId",admin1.getAdminId());
            log.info("Role1111:{}",admin1.getRole());
            claims.put("Role",admin1.getRole());
            log.info("生成 JWT 的 claims：{}", claims);
            String jwt = JwtUtils.generateJwt(claims); //jwt包含了当前登录的员工信息
            log.info("***********************************");
            log.info("jwt1111:{}",jwt);
            log.info("***********************************");
            return Result.success(jwt);
        }
        return Result.error("用户名或密码错误！");

    }

    @Autowired
    private StuService stuService;
    /**
     * 学生登录 匹配验证
     *
     * @param stuId
     * @param password
     * @return
     */
    @PostMapping("/login/stu")
    public Result studentLogin(@RequestParam String stuId, @RequestParam String password) {
        log.info("学生登录，学号：{}", stuId);

        Stu student = stuService.findByStuId(stuId);
        if (student == null) {
            return Result.error("学号或密码错误！");
        }
        // 添加日志输出，查看获取到的student对象初始属性值
        log.info("获取到的student对象初始属性值：stuId={}, name={}, Role={}", student.getStuId(), student.getName(), student.getRole());

        // 检查密码是否为加密后的格式
        boolean isPasswordEncrypted = isPasswordEncrypted(student.getPassword());

        // 验证密码
        boolean isPasswordMatch;
        if (isPasswordEncrypted) {
            // 使用PBKDF2验证加密后的密码
            isPasswordMatch = PBKDF2Utils.verifyPassword(password, student.getPassword());
        } else {
            // 直接比较明文密码
            isPasswordMatch = password.equals(student.getPassword());
        }

        if (!isPasswordMatch) {
            return Result.error("学号或密码错误！");
        }
        // 在放入claims之前再次添加日志输出，查看属性值是否有变化
        log.info("放入claims之前的student对象属性值：stuId={}, name={}, Role={}", student.getStuId(), student.getName(), student.getRole());
        // 生成 JWT 令牌（这里假设你已有生成JWT的工具类JwtUtils，用法和之前类似）
        Map<String, Object> claimss = new HashMap<>();
        claimss.put("stuId", student.getStuId());
        System.out.println("*****************************");
        log.info("StuId:{}",student.getStuId());
        log.info("StuId:{}",claimss);
        System.out.printf("*****************************");
        claimss.put("name", student.getName());
        claimss.put("Role", student.getRole());
        String jwt = JwtUtils.generateJwt(claimss); // 生成令牌

        return Result.success(jwt);
    }

    // 判断密码是否为加密后的格式
    private boolean isPasswordEncrypted(String password) {
        // 这里可以根据实际情况来判断密码是否为加密后的格式
        // 假设加密后的密码长度大于32（16字节盐 + 16字节哈希）
        return password.length() > 32;
    }


    @PostMapping("/register")
    public Result studentRegister(@RequestBody Stu student) {
        log.info("学生注册，学号：{}", student.getStuId());
        // 使用PBKDF2加密密码
        String encodedPassword = PBKDF2Utils.encodePassword(student.getPassword());
        log.info("加密后的密码：encodedPassword：{}", encodedPassword);
        student.setPassword(encodedPassword);
        boolean success = stuService.register(student);
        if (success) {
            return Result.success("注册成功！");
        }
        return Result.error("注册失败，账号重复，请检查数据！");
    }

}
